"""
张量的拼接主要包括
tf.conact() 将向量按指定的维度连接起来其余的维度不变
tf.stack() 将一组R维度张量变为R+1维张量，拼接之后维度会变化

tf.conact(values,axis,name='concat')
values 输入张量
axis 指定拼接维度
name 操作名称
"""

import tensorflow as tf
import numpy as np

concat_sample_1 = tf.random.normal([4, 100, 100, 3])
concat_sample_2 = tf.random.normal([40, 100, 100, 3])

print("原始数据的尺寸分别为", concat_sample_1.shape, concat_sample_2.shape)

concat_1 = tf.concat([concat_sample_1, concat_sample_2], axis=0)

print("拼接后的数据尺寸", concat_1.shape)

"""
tf.stack(values, axis=0, name='stack');
values 输入张量   
axis 指定拼接为维度
name 操作名
"""
stack_sample_1 = tf.random.normal([100, 100, 3])
stack_sample_2 = tf.random.normal([100, 100, 3])

print("原始尺寸", stack_sample_1.shape, stack_sample_2.shape)

stacked_1 = tf.stack([stack_sample_1, stack_sample_2], axis=0)

print("合并后的尺寸", stacked_1.shape)

"""
张量的分割操作主要包括
tf.unstack() 将张量按照特定维度进行拆分
tf.split() 将张量按照特定维度划分为指定的分数
split更加灵活

tf.unstack(value, num=None, axis=0, name='unstack')

value 输入张量
num 表述输出含有num个元素列表，num必须和指定维度的元素的个数相当，通常可以忽略不写
axis 指明根据数据的那个维度进行分割
name 操作名称
"""
tf.unstack(stacked_1, axis=0)

"""
tf.split(value,num_or_size_splits,axis=0)用法
value 输入的张量
num_or_size_splits 准备切成几份
axis 指明根据数据的哪个维度进行分割
tf.split()的分割方法有两种
1传入一个整数，将在axis维度上把张量平均分成几个小张量
2传入一个向量，在axis维度上把张量按照向量元素值切分成几个小的张量

"""
split_sample_1 = tf.random.normal([10, 100, 100, 3])

print("拆分前尺寸大小", split_sample_1.shape)

splited_sample_1 = tf.split(split_sample_1, num_or_size_splits=5, axis=0)
print("当前num_or_size_split=5,拆分结果为", np.shape(splited_sample_1))

splited_sample_2 = tf.split(split_sample_1, num_or_size_splits=[3, 5, 2], axis=0)
print("当前num_or_size_split=[3,5,2],拆分结果为",
      np.shape(splited_sample_2[0]),
      np.shape(splited_sample_2[1]),
      np.shape(splited_sample_2[2]),)